package com.reader.core.utils;

import com.reader.core.utils.CommonVariable;
import org.apache.shiro.crypto.hash.DefaultHashService;
import org.apache.shiro.crypto.hash.HashRequest;
import org.apache.shiro.util.ByteSource;

/**
 * 密码加密工具类
 *
 * @author jiahaikun
 * @date 2017/8/23.
 */
public class EncryptUtil {

    /**
     *
     * @param agorithmName 加密方法 可选MD5 或是SHA-256
     * @param password 密码
     * @param salt  盐
     * @param iterations  迭代次数
     * @return   加密后返回
     */
    public static String encryptPassword(String agorithmName, String password, String salt, int iterations){
        DefaultHashService hashService = new DefaultHashService();

        HashRequest request = new HashRequest.Builder()
                .setAlgorithmName(agorithmName).setSource(ByteSource.Util.bytes(password))
                .setSalt(ByteSource.Util.bytes(salt)).setIterations(iterations).build();
        String encryptPassword = hashService.computeHash(request).toHex();
        return encryptPassword;
    }

    public static void main(String[] args){

        String password = "admin123";
       String encryptPassword= encryptPassword(CommonVariable.ENCRYTP_ALGORITHMNAME,
                                                            password,
                                                            CommonVariable.ENCRYTP_SALT,CommonVariable.ENCRYTP_ITERATIONS);
           System.out.println("密码为："+encryptPassword);
      //  String encrypt=getEncryptOpenApiToken(CommonVariable.ENCRYTP_ALGORITHMNAME,"testkey","sadasdasda","1505715655");
      //  System.out.println("密码为："+encrypt);

    }

    /**
     * 对外开放API 加密
     * @param agorithmName 加密方法可设为MD5
     * @param appid
     * @param secret
     * @param timestamp
     * @return
     * * token string 根据 app_id 和 app_key 加上当前时间参数的整数形式（不含亳秒）动态生成。其
    中时间参数 t 以url参数的形式加在 <callback uri> 后面。
     * 假设有如下参数：
    app_id=10
    app_key=key
    t=1505715655
    则 token string 的值等于 md5("app_id=10&app_key=key&t=1505715655") 的值
    6f77398271ff1e2d3fb5fd8d0423170c 。
    注意以上字符串中 app_id 、 app_key 和 t 的顺序不可改变
     */
    public static String getEncryptOpenApiToken(String agorithmName, String appid, String secret, String timestamp){
        DefaultHashService hashService = new DefaultHashService();
         StringBuilder sbEncrypt=new StringBuilder();
         sbEncrypt.append(appid).append(secret).append(timestamp);
        HashRequest request = new HashRequest.Builder()
                .setAlgorithmName(agorithmName).setSource(ByteSource.Util.bytes(sbEncrypt.toString())).build();
        String encrypt = hashService.computeHash(request).toHex();
        return encrypt;
    }



 }
